import dayjs from "dayjs";

export default calculateOverlapMinutes;

/**
 * 计算两段时间范围的重叠分钟数
 * @param {string|Date} startA 第一段时间的开始（支持dayjs可解析的格式）
 * @param {string|Date} endA 第一段时间的结束
 * @param {string|Date} startB 第二段时间的开始
 * @param {string|Date} endB 第二段时间的结束
 * @returns {number} 重叠的分钟数（无重叠则返回0）
 */
function calculateOverlapMinutes(startA, endA, startB, endB) {
  // 转换为dayjs对象并校验有效性
  const sA = dayjs(startA);
  const eA = dayjs(endA);
  const sB = dayjs(startB);
  const eB = dayjs(endB);

  // 校验时间格式是否有效
  if (!sA.isValid() || !eA.isValid() || !sB.isValid() || !eB.isValid()) {
    throw new Error("时间格式无效，请使用dayjs可解析的格式");
  }

  // 校验时间范围是否有效（开始时间必须早于结束时间）
  if (!sA.isBefore(eA) || !sB.isBefore(eB)) {
    return 0; // 无效的时间范围，无重叠
  }

  // 计算重叠的开始和结束时间
  const maxStart = sA.isAfter(sB) ? sA : sB; // 取较晚的开始时间
  const minEnd = eA.isBefore(eB) ? eA : eB; // 取较早的结束时间

  // 判断是否存在重叠：重叠开始时间 < 重叠结束时间
  if (maxStart.isBefore(minEnd)) {
    // 计算分钟差
    return minEnd.diff(maxStart, "minute");
  } else {
    return 0; // 无重叠
  }
}
